
#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ПоказыватьСиноним=Истина;
	УстановитьУсловноеОформлениеФормы();
	
	ЗаполнитьТаблицуКонстант();

	УИ_РаботаСФормами.ФормаПриСозданииНаСервереСоздатьРеквизитыПараметровЗаписи(ЭтотОбъект,
		Элементы.ГруппаПараметрыЗаписи);
	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы


&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
	ОбработатьПоискКонстант();
КонецПроцедуры

&НаКлиенте
Процедура СтрокаПоискаОчистка(Элемент, СтандартнаяОбработка)
	ОбработатьПоискКонстант();
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьСинонимПриИзменении(Элемент)
	Элементы.ТаблицаКонстантСинонимКонстанты.Видимость = ПоказыватьСиноним;	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаКонстант

&НаКлиенте
Процедура ТаблицаКонстантЗначениеКонстантыНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные = Элементы.ТаблицаКонстант.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения(ЭтотОбъект,
																										  Элемент,
																										  "ЗначениеКонстанты");

	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.Значение = ТекДанные.ЗначениеКонстанты;
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = ТекДанные.ОписаниеТипов;

	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ТекСтрока", ТекДанные.ПолучитьИдентификатор());

	ПараметрыОбработчика.ОповещениеОЗавершении = Новый ОписаниеОповещения("ТаблицаКонстантЗначениеКонстантыНачалоВыбораЗавершение",
		ЭтотОбъект, ПараметрыОповещения);
	
	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикНачалоВыбораЗначения(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаКонстантЗначениеКонстантыПриИзменении(Элемент)
	ТекДанные = Элементы.ТаблицаКонстант.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	КонстантаПриИзменении(ТекДанные);
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаКонстантЗначениеКонстантыОчистка(Элемент, СтандартнаяОбработка)
	ТекДанные = Элементы.ТаблицаКонстант.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияОчистка(ЭтотОбъект,
																							 Элемент,
																							 "ЗначениеКонстанты");

	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = ТекДанные.ОписаниеТипов;

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикОчистка(ПараметрыОбработчика, СтандартнаяОбработка);
	
	КонстантаПриИзменении(ТекДанные);
КонецПроцедуры


#КонецОбласти


#Область ОбработчикиКомандФормы


&НаКлиенте
Процедура Перечитать(Команда)
	Если ЕстьИзмененныеКонстанты() Тогда
		ПоказатьВопрос(Новый ОписаниеОповещения("ПеречитатьЗаверешение", ЭтотОбъект),
			"Есть измененные константы. Произвести запись перед чтением?", РежимДиалогаВопрос.ДаНетОтмена);
	Иначе
		ПрочитатьКонстанты();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьКонстанты(Команда)
	ЗаписатьНаСервере();
КонецПроцедуры

//@skip-warning 
&НаКлиенте
Процедура Подключаемый_НастроитьПараметрыЗаписи(Команда)
	УИ_ОбщегоНазначенияКлиент.РедактироватьПараметрыЗаписи(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) Экспорт
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры
#КонецОбласти

#Область СлужебныеПроцедурыИФункции


&НаКлиенте
Процедура ТаблицаКонстантЗначениеКонстантыНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	ТекДанные = ТаблицаКонстант.НайтиПоИдентификатору(ДополнительныеПараметры.ТекСтрока);
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	КонстантаПриИзменении(ТекДанные);
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформлениеФормы()
	УсловноеОформление.Элементы.Очистить();
	
	//Выделять цветом измененные константы
	НовыйЭлементОформления = УсловноеОформление.Элементы.Добавить();
	НовыйЭлементОформления.Использование = Истина;
	
	УИ_ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НовыйЭлементОформления.Отбор,
															"ТаблицаКонстант.Изменено",
															Истина);
	
	НовыйЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.БледноБирюзовый);
	
	ОформляемоеПоле = НовыйЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Использование = Истина;
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаКонстант");
КонецПроцедуры

&НаКлиенте
Процедура КонстантаПриИзменении(СтрокаКонстанты)
	СтрокаКонстанты.Изменено = Истина;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТаблицуКонстант()

	УстановитьПривилегированныйРежим(Истина);

	ТаблицаКонстант.Очистить();

	Для Каждого Константа Из Метаданные.Константы Цикл

		НоваяСтрока = ТаблицаКонстант.Добавить();
		НоваяСтрока.ИмяКонстанты = Константа.Имя;
		НоваяСтрока.СинонимКонстанты = Константа.Синоним;
		НоваяСтрока.ОписаниеТипов = Константа.Тип;
		НоваяСтрока.ЗначениеКонстанты = Константы[Константа.Имя].Получить();

	КонецЦикла;

	// Заполним функциональные опции констант
	Для Каждого ФОпция Из Метаданные.ФункциональныеОпции Цикл
		Если Не Метаданные.Константы.Содержит(ФОпция.Хранение) Тогда
			Продолжить;
		КонецЕсли;

		СтруктураПоиска = Новый Структура;
		СтруктураПоиска.Вставить("ИмяКонстанты", ФОпция.Хранение.Имя);

		НайденныеСтроки = ТаблицаКонстант.НайтиСтроки(СтруктураПоиска);
		Если НайденныеСтроки.Количество() = 0 Тогда
			Продолжить;
		КонецЕсли;

		НайденныеСтроки[0].ФОпция = ФОпция.Имя;
		НайденныеСтроки[0].ПривилегированныйРежимПриПолучении = ФОпция.ПривилегированныйРежимПриПолучении;
	КонецЦикла;

КонецПроцедуры



&НаСервере
Процедура ЗаписатьНаСервере()
	ВсеУспешно = Истина;
	Для Каждого СтрокаКонстанты Из ТаблицаКонстант Цикл
		Если Не СтрокаКонстанты.Изменено Тогда
			Продолжить;
		КонецЕсли;

		МенеджерКонстанты = Константы[СтрокаКонстанты.ИмяКонстанты].СоздатьМенеджерЗначения();
		МенеджерКонстанты.Прочитать();
		МенеджерКонстанты.Значение = СтрокаКонстанты.ЗначениеКонстанты;

		Если УИ_ОбщегоНазначения.ЗаписатьОбъектВБазу(МенеджерКонстанты,
			УИ_ОбщегоНазначенияКлиентСервер.ПараметрыЗаписиФормы(ЭтотОбъект)) Тогда
			СтрокаКонстанты.Изменено = Ложь;

		Иначе
			ВсеУспешно = Ложь;

		КонецЕсли;

	КонецЦикла;

	Если ВсеУспешно Тогда
		Модифицированность = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьКонстанты()
	ЗаполнитьТаблицуКонстант();
	Модифицированность = Ложь;
КонецПроцедуры

&НаКлиенте
Функция ЕстьИзмененныеКонстанты()
	ЕстьИзменения = Ложь;
	Для Каждого СтрокаКонстанты Из ТаблицаКонстант Цикл
		Если СтрокаКонстанты.Изменено Тогда
			ЕстьИзменения = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Возврат ЕстьИзменения;
КонецФункции

&НаКлиенте
Процедура ПеречитатьЗаверешение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = КодВозвратаДиалога.Отмена Тогда
		Возврат;
	ИначеЕсли Результат = КодВозвратаДиалога.Да Тогда
		ЗаписатьНаСервере();
	КонецЕсли;

	ПрочитатьКонстанты();
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьПоискКонстант()
	Поиск=СокрЛП(НРег(СтрокаПоиска));
	
	Если Не ЗначениеЗаполнено(Поиск) Тогда
		Элементы.ТаблицаКонстант.ОтборСтрок = Неопределено;
	КонецЕсли;	
	
	ОтборСтрок = Новый Структура;
	ОтборСтрок.Вставить("Найдено", Истина);
	Элементы.ТаблицаКонстант.ОтборСтрок = Новый ФиксированнаяСтруктура(ОтборСтрок);
	
	Для Каждого ТекСтрокаКонстанты Из ТаблицаКонстант Цикл
		ТекСтрокаКонстанты.Найдено=СтрНайти(НРег(ТекСтрокаКонстанты.ИмяКонстанты), Поиск) > 0
								   Или СтрНайти(НРег(ТекСтрокаКонстанты.СинонимКонстанты), Поиск) > 0;
	КонецЦикла;

КонецПроцедуры


#КонецОбласти

